]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
app: Consider minimized windows for app comparisons
authorFlorian Müllner <fmuellner@gnome.org>
Tue, 10 May 2016 19:15:36 +0000 (21:15 +0200)
committerFlorian Müllner <fmuellner@gnome.org>
Tue, 10 May 2016 19:36:33 +0000 (21:36 +0200)
We used to take window visibility into account when comparing apps
until commit 1dfc38d078, following changes in the window switcher
due to auto-minimization. However auto-minimization was abolished
and the window switcher changes reverted, so it makes sense again
to sort apps without non-minimized windows last again.

https://bugzilla.gnome.org/show_bug.cgi?id=766238

src/shell-app.c

index afc45cb65836c75a042436db400e72696a1d429a..1593c8915c4b4ddf8e9b87b0775069729edc7622 100644 (file)
@@ -722,6 +722,23 @@ shell_app_get_last_user_time (ShellApp *app)
   return (int)last_user_time;
 }
 
+static gboolean
+shell_app_is_minimized (ShellApp *app)
+{
+  GSList *iter;
+
+  if (app->running_state == NULL)
+    return FALSE;
+
+  for (iter = app->running_state->windows; iter; iter = iter->next)
+    {
+      if (meta_window_showing_on_its_workspace (iter->data))
+        return FALSE;
+    }
+
+  return TRUE;
+}
+
 /**
  * shell_app_compare:
  * @app:
@@ -729,13 +746,17 @@ shell_app_get_last_user_time (ShellApp *app)
  *
  * Compare one #ShellApp instance to another, in the following way:
  *   - Running applications sort before not-running applications.
- *   - The application which the user interacted with most recently
+ *   - If one of them has non-minimized windows and the other does not,
+ *     the one with visible windows is first.
+ *   - Finally, the application which the user interacted with most recently
  *     compares earlier.
  */
 int
 shell_app_compare (ShellApp *app,
                    ShellApp *other)
 {
+  gboolean min_app, min_other;
+
   if (app->state != other->state)
     {
       if (app->state == SHELL_APP_STATE_RUNNING)
@@ -743,6 +764,16 @@ shell_app_compare (ShellApp *app,
       return 1;
     }
 
+  min_app = shell_app_is_minimized (app);
+  min_other = shell_app_is_minimized (other);
+
+  if (min_app != min_other)
+    {
+      if (min_other)
+        return -1;
+      return 1;
+    }
+
   if (app->state == SHELL_APP_STATE_RUNNING)
     {
       if (app->running_state->windows && !other->running_state->windows)